home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / prep.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  125 lines

  1. /* prep - prepare file for statistics     Author: Andy Tanenbaum */
  2.  
  3. #include <ctype.h>
  4. #include <stdio.h>
  5.  
  6. #define TROFF_CHAR    '.'    /* troff commands begin with this char */
  7. #define EOL        '\n'    /* end of line char */
  8. #define APOSTROPHE    047    /* single quote */
  9. #define BACKSLASH       '\\'    /* troff code */
  10.  
  11. int lfread;            /* set when last char read was lf */
  12. int lfwritten;            /* set when last char written was lf */
  13.  
  14. main(argc, argv)
  15. int argc;
  16. char *argv[];
  17. {
  18.  
  19.   int c, backslash();
  20.   FILE *freopen();
  21.  
  22.   if (argc > 2) usage();
  23.   if (argc == 2) {
  24.     if (freopen(argv[1], "r", stdin) == NULL) {
  25.         printf("prep: cannot open %s\n", argv[1]);
  26.         exit(1);
  27.     }
  28.   }
  29.   while ((c = getchar()) != EOF) {
  30.     /* Lines beginning with "." are troff commands -- skip them. */
  31.     if (lfread && c == TROFF_CHAR) {
  32.         skipline();
  33.         continue;
  34.     }
  35.     if (c == BACKSLASH) c = backslash();    /* eat troff stuff */
  36.  
  37.     if (isupper(c)) {
  38.         putchar(tolower(c));
  39.         lfwritten = 0;
  40.         lfread = 0;
  41.         continue;
  42.     }
  43.     if (islower(c)) {
  44.         putchar(c);
  45.         lfwritten = 0;
  46.         lfread = 0;
  47.         continue;
  48.     }
  49.     if (c == APOSTROPHE) {
  50.         putchar(c);
  51.         lfwritten = 0;
  52.         lfread = 0;
  53.         continue;
  54.     }
  55.     lfread = (c == EOL ? 1 : 0);
  56.     if (lfwritten) continue;
  57.     putchar(EOL);
  58.     lfwritten = 1;
  59.   }
  60.   exit(0);
  61. }
  62.  
  63.  
  64. skipline()
  65. {
  66.   char c;
  67.  
  68.   while ((c = getchar()) != EOL);
  69. }
  70.  
  71.  
  72. int backslash()
  73. {
  74. /* A backslash has been seen.  Eat troff stuff. */
  75.  
  76.   int c;
  77.  
  78.   c = getchar();
  79.   switch (c) {
  80.       case 'f':
  81.     c = getchar();
  82.     c = getchar();
  83.     return(c);
  84.  
  85.       case 's':            /* \s7  or \s14 */
  86.     c = getchar();
  87.     c = getchar();
  88.     if (isdigit(c)) c = getchar();
  89.     return(c);
  90.  
  91.       case 'n':            /* \na or \n(xx  */
  92.     c = getchar();
  93.     if (c == '(') {
  94.         c = getchar();
  95.         c = getchar();
  96.     }
  97.     c = getchar();
  98.     return(c);
  99.  
  100.       case '*':            /* / * (XX */
  101.     c = getchar();
  102.     if (c == '(') {
  103.         c = getchar();
  104.         c = getchar();
  105.         c = getchar();
  106.         return(c);
  107.     }
  108.       case '(':            /* troff 4-character escape sequence */
  109.     c = getchar();
  110.     c = getchar();
  111.     c = getchar();
  112.     return(c);
  113.  
  114.       default:
  115.     return(c);
  116.  
  117.   }
  118. }
  119.  
  120. usage()
  121. {
  122.   printf("Usage: prep [file]\n");
  123.   exit(1);
  124. }
  125.